/*******************************************************************************
 * Copyright 2011 See AUTHORS file.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/

package com.badlogic.gdx.physics.box2d;

import com.badlogic.gdx.math.Vector2;

/**
 * A body definition holds all the data needed to construct a rigid body. You can safely re-use body definitions. Shapes are added
 * to a body after construction.
 *
 * @author mzechner
 */
public class BodyDef {
    /**
     * The world position of the body. Avoid creating bodies at the origin since this can lead to many overlapping shapes.
     **/
    public final Vector2 position = new Vector2();

    /**
     * The linear velocity of the body's origin in world co-ordinates.
     **/
    public final Vector2 linearVelocity = new Vector2();
    /**
     * The body type: static, kinematic, or dynamic. Note: if a dynamic body would have zero mass, the mass is set to one.
     **/
    public BodyType type = BodyType.StaticBody;
    /**
     * The world angle of the body in radians.
     **/
    public float angle = 0;
    /**
     * The angular velocity of the body.
     **/
    public float angularVelocity = 0;
    /**
     * Linear damping is use to reduce the linear velocity. The damping parameter can be larger than 1.0f but the damping effect
     * becomes sensitive to the time step when the damping parameter is large.
     **/
    public float linearDamping = 0;
    /**
     * Angular damping is use to reduce the angular velocity. The damping parameter can be larger than 1.0f but the damping effect
     * becomes sensitive to the time step when the damping parameter is large.
     **/
    public float angularDamping = 0;
    /**
     * Set this flag to false if this body should never fall asleep. Note that this increases CPU usage.
     **/
    public boolean allowSleep = true;
    /**
     * Is this body initially awake or sleeping?
     **/
    public boolean awake = true;
    /**
     * Should this body be prevented from rotating? Useful for characters.
     **/
    public boolean fixedRotation = false;
    /**
     * Is this a fast moving body that should be prevented from tunneling through other moving bodies? Note that all bodies are
     * prevented from tunneling through kinematic and static bodies. This setting is only considered on dynamic bodies.
     *
     * @warning You should use this flag sparingly since it increases processing time.
     **/
    public boolean bullet = false;
    /**
     * Does this body start out active?
     **/
    public boolean active = true;
    /**
     * Scale the gravity applied to this body.
     **/
    public float gravityScale = 1;

    /**
     * The body type. static: zero mass, zero velocity, may be manually moved kinematic: zero mass, non-zero velocity set by user,
     * moved by solver dynamic: positive mass, non-zero velocity determined by forces, moved by solver
     */
    public enum BodyType {
        StaticBody(0), KinematicBody(1), DynamicBody(2);

        private int value;

        BodyType(int value) {
            this.value = value;
        }

        public int getValue() {
            return value;
        }
    }
}
